# Copyright (c) 2007, Enrico Franchi
# All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of the University of California, Berkeley nor the
#       names of its contributors may be used to endorse or promote products
#       derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

class _MetaPort(type):
    _metaports = [
        'all',
        'current',
        'active',
        'inactive',
        'installed',
        'uninstalled',
        'outdated'
    ]
    def __getattr__(cls, name):
        if name in _MetaPort._metaports:
            return cls(name)

class PortQuery(object):
    __metaclass__ = _MetaPort
                             
    def __init__(self, name, simple=True):
        self._name   = name
        self._simple = simple
        
    def __str__(self):
        return self._name
        
    def __and__(self, rhs):
        string = "%s and %s" % \
            (   self._dressed(),
                rhs._dressed()
            )
        return PortQuery(string, False)

    def __or__(self, rhs):
        string = "%s or %s" % \
            (   self._dressed(),
                rhs._dressed()
            )
        return PortQuery(string, False)
	
    def __invert__(self):
        string = "not %s" % self._name
        return PortQuery(string, True)

    def str(self):
        return self.__str__()
        
    def _dressed(self):
        if self._simple:
            return self._name
        else:
            return "(%s)" % self._name
        
if __name__ == '__main__':
    print PortQuery('ciao')
    print PortQuery.all
